import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { 
            String t = in.nextLine();
            String s = in.nextLine();
            System.out.println(match(t,s));
        }
    }

    public static boolean match(String t,String s){
        char[] ct = t.toCharArray();
        char[] cs = s.toCharArray();
        int lt = ct.length;
        int ls = cs.length;
        //第一行和第一列相当于辅助列,所以需要多申请.
        boolean[][] dp = new boolean[ls+1][lt+1];
        dp[0][0] = true;
        for(int i = 0; i < ls + 1; i++){
            for(int j = 1; j < lt + 1; j++){
                //字符为*的情况
                if(ct[j-1] == '*'){
                    if(i == 0){
                        //i等于0的情况,第一行通配符为*,直接等于前一个的结果
                        dp[i][j] = dp[i][j-1];
                    }else{
                        //i不等于0的情况,从第二行开始,如果满足这些条件则进行判断,等于上一行或者上一列的或.如果这些都不是就不用处理,直接默认为false.
                        if(cs[i-1] == '.' || 
                        (cs[i-1]>='0'&&cs[i-1]<='9') ||
                        (cs[i-1]>='a'&&cs[i-1]<='z') ||
                        (cs[i-1]>='A'&&cs[i-1]<='Z')){
                            dp[i][j] = dp[i-1][j] || dp[i][j-1];
                        }
                    }
                }else{
                    //当字符不为*时,则需要进行单个字符匹配的判断
                    //注意要i>0,i-1不能为负,且i=0那列直接默认为false
                    if(i > 0 && equ(ct[j-1],cs[i-1])){
                        dp[i][j] = dp[i-1][j-1];
                    }
                }
            }
        }
        return dp[ls][lt];
    }

    public static boolean equ(char t, char s){
        if(t == '?') return true;
        //如果是小写的字符,则转成大写的字符进行比较.
        if(t >= 'a' && t <= 'z'){
            t = (char)(t-'a'+'A');
        }
        if(s >= 'a' && s <= 'z'){
            s = (char)(s-'a'+'A');
        }
        return s == t;
    }
}